; Params:
; A1 - auto execution
; A0 or not provided - manual execution


; Define execution mode
var executionMode = "manual"
if exists(param.A) && param.A == 1
  set var.executionMode = "auto"

if var.executionMode == "manual"
  M291 S1 T5 R"Cleanup in progress" P"Removing obsolete files from previous configuration versions..."

; Prepare logs directory
var logsDir = "0:/sys/logs"
if !fileexists(var.logsDir)
  M470 P{var.logsDir}

; Prepare state directory
var stateDir = "0:/sys/user/state"
if !fileexists(var.stateDir)
  M470 P{var.stateDir}

var rawCleanupVersion = fileread("0:/sys/version.txt", 0, 1, ',')
var cleanupVersion = var.rawCleanupVersion[0]
var cleanupMarker = var.stateDir ^ "/.cleanup-" ^ var.cleanupVersion ^ "-done"
var cleanupLogPath = var.logsDir ^ "/cleanup_old_files_" ^ var.cleanupVersion ^ "_" ^ random(999) ^ ".csv"

echo >{var.cleanupLogPath} "time,action,path,result"
echo >>{var.cleanupLogPath} state.time ^ ",START,cleanup " ^ var.cleanupVersion ^ ","
echo >>{var.cleanupLogPath} state.time ^ ",EXECUTION_MODE," ^ var.executionMode ^ ","

; Statistics:
; deleted - successfully deleted
; skipped - path did not exist or cleanup already applied
; failed  - M472 returned error/warning
var deleted = 0
var skipped = 0
var failed = 0
var cleanupPath = ""

; Idempotency guard
if fileexists(var.cleanupMarker)
  echo >>{var.cleanupLogPath} state.time ^ ",SKIPPED_ALREADY_APPLIED," ^ var.cleanupMarker ^ ","
  set var.skipped = var.skipped + 1

  if var.executionMode == "manual"
    M291 S1 T20 R"Cleanup skipped" P{"Old file cleanup was already applied.<br>Log: " ^ var.cleanupLogPath}

  M99


; ----------------------------
; Files / paths without R1
; ----------------------------

set var.cleanupPath = "0:/macros/System/Settings/Network/Network Diagnostic"
if fileexists(var.cleanupPath)
  M472 P{var.cleanupPath}
  if result == 0
    echo >>{var.cleanupLogPath} state.time ^ ",DELETED," ^ var.cleanupPath ^ "," ^ result
    set var.deleted = var.deleted + 1
  else
    echo >>{var.cleanupLogPath} state.time ^ ",FAILED," ^ var.cleanupPath ^ "," ^ result
    set var.failed = var.failed + 1
else
  echo >>{var.cleanupLogPath} state.time ^ ",SKIPPED_MISSING," ^ var.cleanupPath ^ ","
  set var.skipped = var.skipped + 1


set var.cleanupPath = "0:/macros/System/Settings/Firmware/Update User Settings"
if fileexists(var.cleanupPath)
  M472 P{var.cleanupPath}
  if result == 0
    echo >>{var.cleanupLogPath} state.time ^ ",DELETED," ^ var.cleanupPath ^ "," ^ result
    set var.deleted = var.deleted + 1
  else
    echo >>{var.cleanupLogPath} state.time ^ ",FAILED," ^ var.cleanupPath ^ "," ^ result
    set var.failed = var.failed + 1
else
  echo >>{var.cleanupLogPath} state.time ^ ",SKIPPED_MISSING," ^ var.cleanupPath ^ ","
  set var.skipped = var.skipped + 1


set var.cleanupPath = "0:/macros/System/Settings/Printing/Adjust XU Position"
if fileexists(var.cleanupPath)
  M472 P{var.cleanupPath}
  if result == 0
    echo >>{var.cleanupLogPath} state.time ^ ",DELETED," ^ var.cleanupPath ^ "," ^ result
    set var.deleted = var.deleted + 1
  else
    echo >>{var.cleanupLogPath} state.time ^ ",FAILED," ^ var.cleanupPath ^ "," ^ result
    set var.failed = var.failed + 1
else
  echo >>{var.cleanupLogPath} state.time ^ ",SKIPPED_MISSING," ^ var.cleanupPath ^ ","
  set var.skipped = var.skipped + 1


set var.cleanupPath = "0:/macros/System/Troubleshooting/Chamber Heating Test"
if fileexists(var.cleanupPath)
  M472 P{var.cleanupPath}
  if result == 0
    echo >>{var.cleanupLogPath} state.time ^ ",DELETED," ^ var.cleanupPath ^ "," ^ result
    set var.deleted = var.deleted + 1
  else
    echo >>{var.cleanupLogPath} state.time ^ ",FAILED," ^ var.cleanupPath ^ "," ^ result
    set var.failed = var.failed + 1
else
  echo >>{var.cleanupLogPath} state.time ^ ",SKIPPED_MISSING," ^ var.cleanupPath ^ ","
  set var.skipped = var.skipped + 1


set var.cleanupPath = "0:/macros/System/Calibration/Temperature Tuning/PID Tuning Left Head"
if fileexists(var.cleanupPath)
  M472 P{var.cleanupPath}
  if result == 0
    echo >>{var.cleanupLogPath} state.time ^ ",DELETED," ^ var.cleanupPath ^ "," ^ result
    set var.deleted = var.deleted + 1
  else
    echo >>{var.cleanupLogPath} state.time ^ ",FAILED," ^ var.cleanupPath ^ "," ^ result
    set var.failed = var.failed + 1
else
  echo >>{var.cleanupLogPath} state.time ^ ",SKIPPED_MISSING," ^ var.cleanupPath ^ ","
  set var.skipped = var.skipped + 1


set var.cleanupPath = "0:/macros/System/Calibration/Temperature Tuning/PID Tuning Right Head"
if fileexists(var.cleanupPath)
  M472 P{var.cleanupPath}
  if result == 0
    echo >>{var.cleanupLogPath} state.time ^ ",DELETED," ^ var.cleanupPath ^ "," ^ result
    set var.deleted = var.deleted + 1
  else
    echo >>{var.cleanupLogPath} state.time ^ ",FAILED," ^ var.cleanupPath ^ "," ^ result
    set var.failed = var.failed + 1
else
  echo >>{var.cleanupLogPath} state.time ^ ",SKIPPED_MISSING," ^ var.cleanupPath ^ ","
  set var.skipped = var.skipped + 1


set var.cleanupPath = "0:/sys/configversion.g"
if fileexists(var.cleanupPath)
  M472 P{var.cleanupPath}
  if result == 0
    echo >>{var.cleanupLogPath} state.time ^ ",DELETED," ^ var.cleanupPath ^ "," ^ result
    set var.deleted = var.deleted + 1
  else
    echo >>{var.cleanupLogPath} state.time ^ ",FAILED," ^ var.cleanupPath ^ "," ^ result
    set var.failed = var.failed + 1
else
  echo >>{var.cleanupLogPath} state.time ^ ",SKIPPED_MISSING," ^ var.cleanupPath ^ ","
  set var.skipped = var.skipped + 1


set var.cleanupPath = "0:/sys/resetzbabystep.g"
if fileexists(var.cleanupPath)
  M472 P{var.cleanupPath}
  if result == 0
    echo >>{var.cleanupLogPath} state.time ^ ",DELETED," ^ var.cleanupPath ^ "," ^ result
    set var.deleted = var.deleted + 1
  else
    echo >>{var.cleanupLogPath} state.time ^ ",FAILED," ^ var.cleanupPath ^ "," ^ result
    set var.failed = var.failed + 1
else
  echo >>{var.cleanupLogPath} state.time ^ ",SKIPPED_MISSING," ^ var.cleanupPath ^ ","
  set var.skipped = var.skipped + 1


set var.cleanupPath = "0:/sys/.DS_Store"
if fileexists(var.cleanupPath)
  M472 P{var.cleanupPath}
  if result == 0
    echo >>{var.cleanupLogPath} state.time ^ ",DELETED," ^ var.cleanupPath ^ "," ^ result
    set var.deleted = var.deleted + 1
  else
    echo >>{var.cleanupLogPath} state.time ^ ",FAILED," ^ var.cleanupPath ^ "," ^ result
    set var.failed = var.failed + 1
else
  echo >>{var.cleanupLogPath} state.time ^ ",SKIPPED_MISSING," ^ var.cleanupPath ^ ","
  set var.skipped = var.skipped + 1


set var.cleanupPath = "0:/filaments/.DS_Store"
if fileexists(var.cleanupPath)
  M472 P{var.cleanupPath}
  if result == 0
    echo >>{var.cleanupLogPath} state.time ^ ",DELETED," ^ var.cleanupPath ^ "," ^ result
    set var.deleted = var.deleted + 1
  else
    echo >>{var.cleanupLogPath} state.time ^ ",FAILED," ^ var.cleanupPath ^ "," ^ result
    set var.failed = var.failed + 1
else
  echo >>{var.cleanupLogPath} state.time ^ ",SKIPPED_MISSING," ^ var.cleanupPath ^ ","
  set var.skipped = var.skipped + 1


set var.cleanupPath = "0:/macros/.DS_Store"
if fileexists(var.cleanupPath)
  M472 P{var.cleanupPath}
  if result == 0
    echo >>{var.cleanupLogPath} state.time ^ ",DELETED," ^ var.cleanupPath ^ "," ^ result
    set var.deleted = var.deleted + 1
  else
    echo >>{var.cleanupLogPath} state.time ^ ",FAILED," ^ var.cleanupPath ^ "," ^ result
    set var.failed = var.failed + 1
else
  echo >>{var.cleanupLogPath} state.time ^ ",SKIPPED_MISSING," ^ var.cleanupPath ^ ","
  set var.skipped = var.skipped + 1


set var.cleanupPath = "0:/macros/System/.DS_Store"
if fileexists(var.cleanupPath)
  M472 P{var.cleanupPath}
  if result == 0
    echo >>{var.cleanupLogPath} state.time ^ ",DELETED," ^ var.cleanupPath ^ "," ^ result
    set var.deleted = var.deleted + 1
  else
    echo >>{var.cleanupLogPath} state.time ^ ",FAILED," ^ var.cleanupPath ^ "," ^ result
    set var.failed = var.failed + 1
else
  echo >>{var.cleanupLogPath} state.time ^ ",SKIPPED_MISSING," ^ var.cleanupPath ^ ","
  set var.skipped = var.skipped + 1


; ----------------------------
; Directories / recursive R1
; ----------------------------

set var.cleanupPath = "0:/log"
if fileexists(var.cleanupPath)
  M472 P{var.cleanupPath} R1
  if result == 0
    echo >>{var.cleanupLogPath} state.time ^ ",DELETED," ^ var.cleanupPath ^ "," ^ result
    set var.deleted = var.deleted + 1
  else
    echo >>{var.cleanupLogPath} state.time ^ ",FAILED," ^ var.cleanupPath ^ "," ^ result
    set var.failed = var.failed + 1
else
  echo >>{var.cleanupLogPath} state.time ^ ",SKIPPED_MISSING," ^ var.cleanupPath ^ ","
  set var.skipped = var.skipped + 1

set var.cleanupPath = "0:/gcodes/Slicer"
if fileexists(var.cleanupPath)
  M472 P{var.cleanupPath} R1
  if result == 0
    echo >>{var.cleanupLogPath} state.time ^ ",DELETED_RECURSIVE," ^ var.cleanupPath ^ "," ^ result
    set var.deleted = var.deleted + 1
  else
    echo >>{var.cleanupLogPath} state.time ^ ",FAILED_RECURSIVE," ^ var.cleanupPath ^ "," ^ result
    set var.failed = var.failed + 1
else
  echo >>{var.cleanupLogPath} state.time ^ ",SKIPPED_MISSING," ^ var.cleanupPath ^ ","
  set var.skipped = var.skipped + 1


set var.cleanupPath = "0:/gcodes/Test Prints"
if fileexists(var.cleanupPath)
  M472 P{var.cleanupPath} R1
  if result == 0
    echo >>{var.cleanupLogPath} state.time ^ ",DELETED_RECURSIVE," ^ var.cleanupPath ^ "," ^ result
    set var.deleted = var.deleted + 1
  else
    echo >>{var.cleanupLogPath} state.time ^ ",FAILED_RECURSIVE," ^ var.cleanupPath ^ "," ^ result
    set var.failed = var.failed + 1
else
  echo >>{var.cleanupLogPath} state.time ^ ",SKIPPED_MISSING," ^ var.cleanupPath ^ ","
  set var.skipped = var.skipped + 1


set var.cleanupPath = "0:/sys/Result"
if fileexists(var.cleanupPath)
  M472 P{var.cleanupPath} R1
  if result == 0
    echo >>{var.cleanupLogPath} state.time ^ ",DELETED_RECURSIVE," ^ var.cleanupPath ^ "," ^ result
    set var.deleted = var.deleted + 1
  else
    echo >>{var.cleanupLogPath} state.time ^ ",FAILED_RECURSIVE," ^ var.cleanupPath ^ "," ^ result
    set var.failed = var.failed + 1
else
  echo >>{var.cleanupLogPath} state.time ^ ",SKIPPED_MISSING," ^ var.cleanupPath ^ ","
  set var.skipped = var.skipped + 1


set var.cleanupPath = "0:/sys/Testing"
if fileexists(var.cleanupPath)
  M472 P{var.cleanupPath} R1
  if result == 0
    echo >>{var.cleanupLogPath} state.time ^ ",DELETED_RECURSIVE," ^ var.cleanupPath ^ "," ^ result
    set var.deleted = var.deleted + 1
  else
    echo >>{var.cleanupLogPath} state.time ^ ",FAILED_RECURSIVE," ^ var.cleanupPath ^ "," ^ result
    set var.failed = var.failed + 1
else
  echo >>{var.cleanupLogPath} state.time ^ ",SKIPPED_MISSING," ^ var.cleanupPath ^ ","
  set var.skipped = var.skipped + 1


; ----------------------------
; Finish
; ----------------------------

echo >>{var.cleanupLogPath} state.time ^ ",SUMMARY_DELETED," ^ var.deleted ^ ","
echo >>{var.cleanupLogPath} state.time ^ ",SUMMARY_SKIPPED," ^ var.skipped ^ ","
echo >>{var.cleanupLogPath} state.time ^ ",SUMMARY_FAILED," ^ var.failed ^ ","

if var.failed == 0
  echo >{var.cleanupMarker} "cleanup " ^ var.cleanupVersion ^ " completed"
  echo >>{var.cleanupLogPath} state.time ^ ",MARKER_CREATED," ^ var.cleanupMarker ^ ","
else
  echo >>{var.cleanupLogPath} state.time ^ ",MARKER_NOT_CREATED,cleanup had failures,"

if var.executionMode == "manual"
  if var.failed == 0
    M291 S1 T30 R"Cleanup complete" P{"Deleted: " ^ var.deleted ^ "<br>Skipped missing: " ^ var.skipped ^ "<br>Failed: " ^ var.failed ^ "<br>Log: " ^ var.cleanupLogPath}
  else
    M291 S1 T60 R"Cleanup finished with errors" P{"Deleted: " ^ var.deleted ^ "<br>Skipped missing: " ^ var.skipped ^ "<br>Failed: " ^ var.failed ^ "<br>Log: " ^ var.cleanupLogPath}